热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

框图|正反_AndroidCamera打开预览流程分析打开camera的SDK流程

篇首语:本文由编程笔记#小编为大家整理,主要介绍了AndroidCamera打开预览流程分析--打开camera的SDK流程相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了Android Camera 打开预览流程分析--打开camera的SDK流程相关的知识,希望对你有一定的参考价值。


android系统应用场景中,Camera的使用场景变得越来越重要,在手机端不管是牌照美颜,还是拍小视频上传小视频平台。在其他领域,如车载,倒车视频,360全景影像也同样会用到Camera接口。那我们这个系列就拿Camera来分析了,我们主要就是android camera流程进行一个分析,对于照片美颜,视频上传这些就不在我们关注的范围了。那我们分析还是带着问题去分析吧,Camera就如何打开的,现在一个手机上少则2,3个摄像头,多着5~6个摄像头,那如何去打开想要的那个摄像头呢。另一方面的问题就是Camera预览窗口的图像是如何传到我们打开的那个窗口的,经过了那些流程呢。我们后续的分析文章就围绕着两个方面来展开分析。
## Camera的分层框架 (等分析完这两个流程,应该就可以画出这个框图了)
HAL层服务:frameworks/hardware/interfaces/cameraservice
FW层服务: frameworks/av/services/camera/libcameraservice
FW层SDK: frameworks/base/core/java/android/hardware/camera(2)

Camera的打开

我们就从android 标准的camera open接口开始撸:

open() ------framework/base/core/java/android/hardware/camera.java
new Camera(int id)
cameraInitVersion(int cameraId, int halVersion)
native_setup(new WeakReference<Camera>(this), cameraId, halVersion, packageName)
android_hardware_Camera_native_setup(..., jint cameraId, jint halVersion, jstring clientPackageName) -----framework/base/core/jni/android_hardware_camera.cpp

Camera从open接口开始分析&#xff0c;直接就调用到JNI中去了&#xff0c;我们接着从JNI中继续分析&#xff1a;

static jint android_hardware_Camera_native_setup(JNIEnv *env, jobject thiz,
jobject weak_this, jint cameraId, jint halVersion, jstring clientPackageName)

...
//调用camera的connect接口 打开camera
camera &#61; Camera::connect(cameraId, clientName,
Camera::USE_CALLING_UID, Camera::USE_CALLING_PID);
...
sp<JNICameraContext> context &#61; new JNICameraContext(env, weak_this, clazz, camera);
context->incStrong((void*)android_hardware_Camera_native_setup);
camera->setListener(context);
// save context in opaque field
env->SetLongField(thiz, fields.context, (jlong)context.get());
// Update default display orientation in case the sensor is reverse-landscape
CameraInfo cameraInfo;
//获取camera的信息
status_t rc &#61; Camera::getCameraInfo(cameraId, &cameraInfo);
...

从JNI的native_setup中可以看到&#xff0c;调用了camera的connect接口&#xff0c;成功打开之后就可以获取camera的信息了. 再往下分析时&#xff0c;发现很多不对劲的地方&#xff0c;网上去百度了下&#xff0c;发现我们现在分析的camera 接口是Camera 最早的接口了&#xff0c;现在基本被弃用了&#xff0c;现在基本都是是使用Camera2的API接口&#xff0c;Camera2 与Camera 接口还是有挺大区别。Camera接口都被弃用了&#xff0c;我们就直接上手分析Camera2的接口吧。


Camera2 的接口

上面有说到camera 已经被弃用了&#xff0c;都推荐使用camera2的接口。我们就直接再从camera2 开始分析。camer2中有好些类&#xff1a;
CameraManager
相机系统服务&#xff0c;用于管理和连接相机设备
CameraDevice
相机设备类&#xff0c;和Camear1中的Camera类似
CameraCharacteristics
用于获取相机信息&#xff0c;内部携带大量的相机信息&#xff0c;包括摄像头的正反等&#xff0c;和Camear1中的Camera.Parameters同等功能。
CameraRequest
相机捕获图像的设置请求&#xff0c;包括sensor, flashlight等
CameraCaptureSession
请求抓去相机图像帧的会话&#xff0c;会话会创建一个通道&#xff0c;一个CameraDevice只能打开一个CameraCaptureSession.源头是Target, Target可以是Preview, 也可以是ImageReader


打开相机

public void Open()
CameraManager cameraManager &#61; (CameraManager)getSystemService(Context.CAMERA_SERVICE);
for(String cameraId: cameraManager.getCameraIdList())
CameraCharacteristics characteristics &#61; cameraManager.getCameraCharacteristics(cameraId);
//打开相机&#xff0c;第一个参数&#xff1a;哪个摄像头&#xff0c;第二个参数mStateCallback为相机打开的回调接口&#xff0c;第三个参数用来确定callback在哪个线程中执行&#xff0c;为null的话&#xff0c;在当前线程中执行
cameraManager.openCamera(cameraId, mStateCallback, null)


private final CameraDevice.StateCallback mStateCallback &#61; new CameraDevice.StateCallback()
public void onOpened(CameraDevice camera)
mCameraDevice &#61; camera;
...


public void onDisconnected(CameraDevice camera)
camera.close();
mCameraDevice &#61; null;

public void onError()CameraDevice camera, int error
camera.close();
mCameraDevice &#61; null;


打开Camera时将CameraDevice.StateCallback对象传给openCamera当做参数&#xff0c;在OnOpened的回调中&#xff0c;再把Camera对象传给mCameraDevice, 后面就是用mCameraDevice 来操作。
那我们看看CameraManager.openCamera的流程吧。

public void openCamera(&#64;NonNull String cameraId,
&#64;NonNull final CameraDevice.StateCallback callback, &#64;Nullable Handler handler)
throws CameraAccessException
openCameraForUid(cameraId, callback, CameraDeviceImpl.checkAndWrapHandler(handler),
USE_CALLING_UID);

public void openCameraForUid(&#64;NonNull String cameraId,
&#64;NonNull final CameraDevice.StateCallback callback, &#64;NonNull Executor executor,
int clientUid)
throws CameraAccessException
......
openCameraDeviceUserAsync(cameraId, callback, executor, clientUid);

private CameraDevice openCameraDeviceUserAsync(String cameraId,
CameraDevice.StateCallback callback, Executor executor, final int uid)
throws CameraAccessException
CameraCharacteristics characteristics &#61; getCameraCharacteristics(cameraId);
CameraDevice device &#61; null;
synchronized (mLock)
ICameraDeviceUser cameraUser &#61; null;
//初始化android.hardware.camera2.impl.CameraDeviceImpl
android.hardware.camera2.impl.CameraDeviceImpl deviceImpl &#61;
new android.hardware.camera2.impl.CameraDeviceImpl(
cameraId,
callback,
executor,
characteristics,
mContext.getApplicationInfo().targetSdkVersion);
ICameraDeviceCallbacks callbacks &#61; deviceImpl.getCallbacks();

//初始化CameraService
ICameraService cameraService &#61; CameraManagerGlobal.get().getCameraService();
//CameraService 连接设备
cameraUser &#61; cameraService.connectDevice(callbacks, cameraId,
mContext.getOpPackageName(), uid);
deviceImpl.setRemoteDevice(cameraUser);
device &#61; deviceImpl;

return device;

这一步调用就直接调用到CameraService 里去了&#xff0c;与其他服务不同的是&#xff0c;其他服务直接是在SystemServer里的一个服务&#xff0c;CameraService是运行在CameraServer的一个独立进程中的。里面是使用cpp代码写的一个进程。下篇我们继续研究这个CameraService进程。


推荐阅读
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 从零学Java(10)之方法详解,喷打野你真的没我6!
    本文介绍了从零学Java系列中的第10篇文章,详解了Java中的方法。同时讨论了打野过程中喷打野的影响,以及金色打野刀对经济的增加和线上队友经济的影响。指出喷打野会导致线上经济的消减和影响队伍的团结。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
author-avatar
乌龟北京飘
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有